package drazing;

import java.io.*;

/**
 * Gestor de records
 * @author xcubo
 */
public class RecordManager
{
    private RecordTable rtable;
    private boolean mod;

    public RecordManager()
    {
        mod = false;
        rtable = new RecordTable();
    }

    /**
     * Carga los records desde el fichero
     */
    public void loadRecords()
    {
        try
        {
            FileInputStream fis = new FileInputStream("records.dat");
            ObjectInputStream entrada=new ObjectInputStream(fis);
            rtable=(RecordTable)entrada.readObject();
            entrada.close();
        }
        catch(ClassNotFoundException cnfe) {}
        catch(IOException ine)
        {
            System.out.println("El fichero no existe o todavía está vacío");
            try
            {
                ObjectOutputStream salida=new ObjectOutputStream(new FileOutputStream("records.dat"));
                salida.writeObject(rtable);
                salida.close();
            }
            catch(IOException oute){System.out.println("No se puede crear.");}
        }
        
    }

    /**
     * Guarda los records en su fichero
     */
    public void saveRecords() 
    {
        if (mod)
        {
            System.out.println("NEW RECORD!");
            try
            {
                FileOutputStream fos = new FileOutputStream("records.dat");
                ObjectOutputStream salida = new ObjectOutputStream(fos);
                salida.writeObject(rtable);
                salida.close();
            }
            catch(IOException e){}
        }
    }

    /**
     * Inserta una nueva configuración en los records
     * @param setup Settings a insertar
     */
    public void insert(Settings setup)
    {
        int ind =rtable.check(setup);
        if (ind >= 0)
        {
            rtable.insert(setup, ind);
            mod = true;
        }
    }

    /**
     * Recupera un Settings del ranking
     * @param i Indica el Settings a recuperar
     * @return Settings
     */
    public Settings getTopPlayer(int i)
    {
        return rtable.getTopPlayer(i);
    }
   

}

/**
 * Tabla de records
 * @author xcubo
 */
class RecordTable implements Serializable
{
    private int MAX_TOP = 10;
    private Settings[] table;

    public RecordTable()
    {
        Settings initial = new Settings();
        table = new Settings[MAX_TOP];
        for (int i=0;i<MAX_TOP;i++)
            table[i] = initial;
    }
    /**
     * Comprueba si un Settings dado entra en el TOP 10
     * @param set Setting a comprobar
     * @return Indice en el ranking, 0 si no entra
     */
    public int check(Settings set)
    {
        Tiempo time = set.getTime();
        if (time.isZero())
            return -1;
        Tiempo table_time = null;
        for(int i=0;i<=MAX_TOP-1;i++)
        {
            table_time = table[i].getTime();
            if (time.minor(table_time) || table_time.isZero())
                return i;
        }
        return -1;
    }
    /**
     * Inserta un Setting en una posición dada
     * @param s Setting a insertar
     * @param index Posición donde insertar
     */
    public void insert(Settings s, int index)
    {
        for(int i=MAX_TOP-2; i>=index; i--)
            table[i+1]=table[i];
        table[index] = s;
    }
    /**
     * Recupera el Setting de la posición i
     * @param i Posición
     * @return Settings Datos a insertar
     */
    public Settings getTopPlayer(int i)
    {
        assert(i>=0 && i<MAX_TOP);
        return table[i];
    }
}